#ifndef ZIGBEEDATACONTROL_H
#define ZIGBEEDATACONTROL_H

#include <QObject>

#include "dev/serialPort/serialport.h"
#include "tools/constant.h"
#include "tools/datafilter.h"

#include <QDebug>



/**
 * @brief The ZigBeeDataControl class
 * 对串口传过来的信息进行解析，根据约定发送到各个部分
 * 包含一个数据的过滤器
 *
 *
 */

class ZigBeeDataControl : public QObject
{
    Q_OBJECT
public:
    explicit ZigBeeDataControl(QObject *parent = 0);

#ifdef TEST_NET
public slots:
    void test();
#endif
signals:

    void sig_realTimeInfo(const QString &info);
    /**
     * @brief sig_sensorData 发送给view层显示传感器实时数据
     * @param address 传感器地址
     * @param value 实时数据
     */
    void sig_sensorData(const QString& address,int value);
    /**
     * @brief sig_sensorData 发送给view层显示传感器实时数据
     * @param name 设备名
     * @param value 数值
     */
    void sig_sensorData(ushort name, int flag, int value);
    /**
     * @brief sig_items 发送给类表项
     * @param adress  地址
     * @param name 设备名
     * @param value 值
     * @param flag 数据标识
     */

    void sig_items(const QString& adress, int name, int value, int flag);


    /**
     * @brief sig_netTopologyBuild 发送给网络拓扑的部分来建立网络
     * @param data 约定的表示格式
     */
    void sig_netTopologyBuild(const QString& data);
    /**
     * @brief sig_netTopologyBuild 发送给网络拓扑的部分来建立网络
     * @param addr 节点地址
     * @param parentAddr 父节点地址
     * @param name 节点名
     */
    void sig_netTopologyBuild(char type,const QString &addr,const QString &parentAddr,ushort name);
    /**
     * @brief sig_netTopologyTest 发送给网络拓扑的部分来监测网络
     * @param address 传感器地址
     */
    void sig_netTopologyTest(const QString& address);
    /**
     * @brief sig_netTopologyTest 发送给网络拓扑的部分来监测网络反馈的信息，说明节点未丢失
     * @param addr 节点地址
     * @param name 设备名
     */
    void sig_netTopologyTest(const QString &addr, ushort name);

    /**
     * @brief sig_badData 不正常的数据需要通过信息发送出去，需要添加一下相关的节点的信息
     * @param name 设备名
     * @param flag 数据分类标识
     * @param value bad值
     *
     *
     */

    void sig_badData(ushort name,int flag,int value);

    /**
     * @brief sig_clear0
     * @param name
     */
    void sig_clear0(ushort name);

    void sig_coordinatorTest();
public slots:
    /**
     * @brief slt_data 接收来只zigbee汇聚节点的串口发送的数据，根据标识进行处理
     * @param data 数据
     */
    void slt_data(const SerialPortData& data);
    /**
     * @brief slt_addAfilte 添加一个过滤的策略
     * @param f 策略
     */
    void slt_addAfilte(const Filter &f);
private:

    /**
     * @brief m_dataFilter 一个过滤器
     */
    DataFilter m_dataFilter;
    /**
     * @brief sersor 对与传感节点的处理
     * @param data 去除标识的内容
     */
    void sersor(int flag,const QByteArray& data);
    /**
     * @brief netTopologyBuild 对与网络产生的处理
     * @param data 去除标识的内容
     */
    void netTopologyBuild(char type, const QByteArray &data);
    /**
     * @brief netTopologyTest 对与测试产生的处理
     * @param data 去除标识的内容
     */
    void netTopologyTest(const QByteArray &data);


    void CoordinatorTest(const QByteArray &data);


    void readSettings();
};

#endif // ZIGBEEDATACONTROL_H
